#ifndef SMARTPAGENUMBERSELECTOR_H
#define SMARTPAGENUMBERSELECTOR_H

#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QMouseEvent>
#include <QHoverEvent>
#include <QTimer>
#include <QDialog>
#include "processingsettings.h"
#include "pagepositionsystem.h"              // 统一页码位置系统
#include "gridpagenumbersystem.h"            // 3×3网格调节系统
// #include "physicalpagenumberrenderer.h" - 已移除，使用网格系统直接绘制

class SmartPageNumberSelector : public QWidget
{
    Q_OBJECT

public:
    explicit SmartPageNumberSelector(QWidget *parent = nullptr);

    // 使用系统级统一位置枚举 - Martin Fowler重构：消除重复枚举
    using Position = PagePositionSystem::Position;

    void setPageNumberSettings(const ProcessingSettings::PageNumberSettings& settings);
    ProcessingSettings::PageNumberSettings getPageNumberSettings() const;

    // 新增：设置完整的处理设置（包含边距信息）
    void setProcessingSettings(const ProcessingSettings& settings);

    void setSamplePage(int currentPage, int totalPages);

    // 样式设置
    void setPageColor(const QColor& color);
    void setHoverColor(const QColor& color);
    void setSelectedColor(const QColor& color);

signals:
    void positionChanged(Position position);
    void settingsChanged(const ProcessingSettings::PageNumberSettings& settings);
    void pagePositionPreviewChanged(const QPointF& position); // 实时预览信号
    void gridStateChanged(Position position, const GridPageNumberSystem::GridState& gridState); // 网格状态变化信号

public:
    // 获取页面矩形（用于坐标转换 - MainWindow需要）
    QRectF getPageRect() const;

protected:
    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseDoubleClickEvent(QMouseEvent *event) override; // 双击重置网格事件
    void leaveEvent(QEvent *event) override;

private slots:
    void onDelayedPreviewUpdate();

private:
    // 简化的绘制方法
    void drawPageBackground(QPainter& painter);
    void drawCenterIndicators(QPainter& painter);
    void drawPositionZones(QPainter& painter);
    void drawPageNumber(QPainter& painter);
    void drawHoverEffect(QPainter& painter);
    void drawGridPoints(QPainter& painter, Position position); // 网格点绘制

    // 位置计算
    QRectF getPositionZone(Position position) const;
    QPointF calculatePageNumberPosition(Position position) const;
    Position getPositionAtPoint(const QPointF& point) const;

    // 样式相关
    void updateCursor(const QPointF& mousePos);
    QString getPositionName(Position position) const;

    // 网格系统相关
    QPointF getBasePositionInPixels(Position position) const;
    GridPageNumberSystem::GridState snapToGrid(Position position, const QPointF& pixelPosition) const;
    QPointF gridToPixelPosition(Position position, const GridPageNumberSystem::GridState& gridState) const;
    QList<QPointF> getGridPositions(Position position) const;
    void resetGridToCenter(Position position);

    // 简化的状态管理
    bool m_isPressed = false;
    bool m_isDragging = false;      // 是否正在拖动
    Position m_selectedPosition = Position::BottomCenter;
    Position m_hoveredPosition = Position::Custom;  // 默认无悬停状态
    Position m_pressedPosition = Position::BottomCenter;

    // 网格系统状态
    GridPageNumberSystem m_gridSystem;     // 3×3网格管理器
    QPointF m_dragStartPosition;            // 拖拽开始位置
    bool m_showGridPoints = false;          // 是否显示网格点

    // 页码设置
    ProcessingSettings::PageNumberSettings m_settings;
    int m_currentPage = 1;
    int m_totalPages = 10;

    // 新增：完整的处理设置（包含边距信息）
    ProcessingSettings m_processingSettings;
    
    // 物理尺寸渲染器已移除，使用网格系统直接绘制
    // std::unique_ptr<PhysicalPageNumberRenderer> m_physicalRenderer;

    // 样式属性
    QColor m_pageColor = QColor(255, 255, 255);
    QColor m_zoneColor = QColor(52, 152, 219, 30);  // iOS蓝，30%透明度
    QColor m_hoverColor = QColor(52, 152, 219, 60);  // iOS蓝，60%透明度
    QColor m_selectedColor = QColor(52, 152, 219);    // iOS蓝
    QColor m_pageNumberColor = Qt::black;

    // 尺寸和间距 - 放大1.25倍后的协调设置
    qreal m_margin = 6.0;   // 放大后的边距
    qreal m_zoneSize = 18.0; // 放大后的区域尺寸

    // 网格系统常量
    static constexpr double GRID_STEP_MM = 10.0;     // 网格步进10毫米
    static constexpr double DEFAULT_DPI = 300.0;     // 默认DPI
    static constexpr double MM_PER_INCH = 25.4;      // 毫米每英寸

    // 预览更新定时器（避免频繁重绘）
    QTimer* m_previewTimer;
    static constexpr int PREVIEW_DELAY_MS = 100;

    // 位置描述（用于工具提示）- 基于新的6位置系统
    QStringList m_positionNames = {
        "顶部左侧", "顶部居中", "顶部右侧",
        "底部左侧", "底部居中", "底部右侧",
        "自由定位"
    };
};

#endif // SMARTPAGENUMBERSELECTOR_H